from DataClasses import *
from DataHandlerBase import *
#--------------------------------------------------------------------
#DatenHandler fuer Spezifische Daten (Daten Haltung und Konsistenz sollen hier realisiert sein)
#--------------------------------------------------------------------


#--------------------------------------------------------------------
#DatenHandler fuer Lehrveranstaltungen 
#--------------------------------------------------------------------
class DataHandlerLehrVeranstaltung(DataHandlerDescriptionBase):

    def Remove(self, Bezeichner):
            for currentItem in self.ItemList:
                    if  currentItem.Bezeichner == Bezeichner:
                        if len(currentItem.LerneinheitListe) == 0:
                            self.ItemList.remove(currentItem)
                            pickle.dump(self.ItemList ,open( self.fileName, "wb" ))
                            return True
                        else:
                            break #item gefunden jedoch nicht leer
            return False

    def AddLerneinheit(self,Bezeichner,Id):
        for lehrVeranstaltung in self.ItemList:
            if  lehrVeranstaltung.Bezeichner == Bezeichner:
                lehrVeranstaltung.Add(Id)
                pickle.dump(self.ItemList ,open( self.fileName, "wb" ))
                return True
        return False

    def RemoveLerneinheit(self,Id):

        datachanged = False
        for lehrVeranstaltung in self.ItemList:
            if Id in lehrVeranstaltung.LerneinheitListe:
                lehrVeranstaltung.Remove(Id)
                datachanged = True

        if datachanged == True:
            pickle.dump(self.ItemList ,open( self.fileName, "wb" ))

        return True

#--------------------------------------------------------------------
#DatenHandler fuer Themen 
#--------------------------------------------------------------------
class DataHandlerThemen(DataHandlerDescriptionBase):

    def AddAbschnitt(self,Bezeichner,EinheitAbschnittKey):
        for thema in self.ItemList:
            if thema.Bezeichner == Bezeichner:
                for t in thema.Abschnitte:
                    if t.LerneinheitNummer == EinheitAbschnittKey.LerneinheitNummer and t.AbschnittBezeichner == EinheitAbschnittKey.AbschnittBezeichner:
                        #abschnitt schon vorhanden
                        return False
                thema.Add(EinheitAbschnittKey)
                pickle.dump(self.ItemList ,open( self.fileName, "wb" ))

                return True
        return False

    def RemoveAbschnitt(self,EinheitAbschnittKey):
        for thema in self.ItemList:
            #if thema.Beschreibung == Beschreibung:
                for t in thema.Abschnitte:
                    if t.LerneinheitNummer == EinheitAbschnittKey.LerneinheitNummer and t.AbschnittBezeichner == EinheitAbschnittKey.AbschnittBezeichner:
                        thema.Remove(t)
                        pickle.dump(self.ItemList ,open( self.fileName, "wb" ))

                return True
        return False

#--------------------------------------------------------------------
#DatenHandler fuer Lerneinheiten und Bestandteile 
#--------------------------------------------------------------------
class DataHandlerLernEinheit(DataHandlerBase):

    def __init__(self,DataHandlerLehrVeranstaltung,DataHandlerThema,fileName):
        DataHandlerBase.__init__(self,fileName)
        self.DataHandlerLehrVeranstaltung = DataHandlerLehrVeranstaltung
        self.DataHandlerThema = DataHandlerThema
        self.LernEinheitsList = []
        self.LernEinheitsList = pickle.load( open( self.fileName, "rb" ))

    def AddAbschnitt(self,Nummer,Abschnitt,Thema):
        for LernEinheit in self.LernEinheitsList:
            if  LernEinheit.Nummer == Nummer:

                for abschnittobject in LernEinheit.AbschnittList:
                    if abschnittobject.Bezeichner == Abschnitt.Bezeichner:
                        #schon vorhanden ersetzen
                        abschnittobject.Beschreibung = Abschnitt.Beschreibung
                        pickle.dump(self.LernEinheitsList ,open( self.fileName, "wb" )) 
                        self.DataHandlerThema.RemoveAbschnitt(EinheitAbschnittKey(Nummer,Abschnitt.Bezeichner))
                        self.DataHandlerThema.AddAbschnitt(Thema,EinheitAbschnittKey(Nummer,Abschnitt.Bezeichner))
                        return True

                LernEinheit.AddAbschnitt(Abschnitt)
                pickle.dump(self.LernEinheitsList ,open( self.fileName, "wb" )) 
                self.DataHandlerThema.AddAbschnitt(Thema,EinheitAbschnittKey(Nummer,Abschnitt.Bezeichner))

                return True
        return False

    def RemoveAbschnitt(self,Nummer,AbschnittBezeichner):
        for LernEinheit in self.LernEinheitsList:
            if  LernEinheit.Nummer == Nummer:
                LernEinheit.RemoveAbschnitt(AbschnittBezeichner)
                pickle.dump(self.LernEinheitsList ,open( self.fileName, "wb" )) 
                self.DataHandlerThema.RemoveAbschnitt(EinheitAbschnittKey(Nummer,AbschnittBezeichner))
                return True
        return False

    def AddMarke(self,Nummer,Bezeichner):
        for LernEinheit in self.LernEinheitsList:
            if  LernEinheit.Nummer == Nummer:

                for markenBezeichnung in LernEinheit.MarkenList:
                    if markenBezeichnung == Bezeichner:
                        return True #schon vorhanden

                LernEinheit.AddMarke(Bezeichner)
                pickle.dump(self.LernEinheitsList ,open( self.fileName, "wb" )) 
                return True
        return False

    def RemoveMarke(self,Nummer,Bezeichner):
        for LernEinheit in self.LernEinheitsList:
            if  LernEinheit.Nummer == Nummer:
                LernEinheit.RemoveMarke(Bezeichner)
                pickle.dump(self.LernEinheitsList ,open( self.fileName, "wb" )) 
                return True
        return False

    def GetFrageObject(self,Nummer,AbschnittBezeichner,frageString):
        for LernEinheit in self.LernEinheitsList:
            if  LernEinheit.Nummer == Nummer:
                for abschnitt in LernEinheit.AbschnittList:
                        if abschnitt.Bezeichner == AbschnittBezeichner:
                            for frageO in abschnitt.Fragen:
                                if frageO.Text == frageString:
                                    return frageO
        return None

    def AddFrageToAbschnitt(self,Nummer,AbschnittBezeichner,frageObject):

        for LernEinheit in self.LernEinheitsList:
            if  LernEinheit.Nummer == Nummer:
                for abschnitt in LernEinheit.AbschnittList:
                    if abschnitt.Bezeichner == AbschnittBezeichner:
                        abschnitt.AddFrage(frageObject)
                        pickle.dump(self.LernEinheitsList ,open( self.fileName, "wb" )) 
                        return True
        return False

    def RemoveFrageToAbschnitt(self,Nummer,AbschnittBezeichner,frageString):
        for LernEinheit in self.LernEinheitsList:
            if  LernEinheit.Nummer == Nummer:
                for abschnitt in LernEinheit.AbschnittList:
                        if abschnitt.Bezeichner == AbschnittBezeichner:
                            for frageO in abschnitt.Fragen:
                                if frageO.Text == frageString:
                                    abschnitt.RemoveFrage(frageO)
                                    return True
        return False

    def Add(self, lv,LVBezeichner):
        if lv.Nummer != 0: #element schon vorhanden -> update
            for LernEinheit in self.LernEinheitsList:
                if LernEinheit.Nummer == lv.Nummer:
                    LernEinheit.Bezeichner = lv.Bezeichner
                    LernEinheit.Termin = lv.Termin
                    pickle.dump(self.LernEinheitsList ,open( self.fileName, "wb" ))

                    self.DataHandlerLehrVeranstaltung.RemoveLerneinheit(lv.Nummer)
                    self.DataHandlerLehrVeranstaltung.AddLerneinheit(LVBezeichner,lv.Nummer)
                    return True
        else:
            if len(self.LernEinheitsList) == 0:
                lv.Nummer = 1#erster eintrag
            else:
                lv.Nummer = self.LernEinheitsList[-1].Nummer + 1#folge eintrag

            self.LernEinheitsList.append(lv)
            pickle.dump(self.LernEinheitsList ,open( self.fileName, "wb" ))
        

        self.DataHandlerLehrVeranstaltung.AddLerneinheit(LVBezeichner,lv.Nummer)

        return True

    def Remove(self, Nummer):
        for LernEinheit in self.LernEinheitsList:
                    if  LernEinheit.Nummer == Nummer:
                        self.LernEinheitsList.remove(LernEinheit)
                        pickle.dump(self.LernEinheitsList ,open( self.fileName, "wb" ))

                        self.DataHandlerLehrVeranstaltung.RemoveLerneinheit(Nummer)

                        return True
        return False
    
    def GetElement(self,Nummer):
        for LernEinheit in self.LernEinheitsList:
                    if  LernEinheit.Nummer == Nummer:
                            return LernEinheit
        return None
        




